package com.gpj.netty.demo.chat;

import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.group.ChannelGroup;
import io.netty.channel.group.DefaultChannelGroup;
import io.netty.util.concurrent.GlobalEventExecutor;

/**
 * @className ChatServerHandler
 * @description TODO
 * @author GPJ
 * @date 2021/3/3 15:07
 * @version 1.0
 **/
public class ChatServerHandler extends SimpleChannelInboundHandler<String> {
	private static ChannelGroup channelGroup =
			new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);

	@Override
	protected void channelRead0(ChannelHandlerContext channelHandlerContext, String s) throws Exception {

	}

	@Override
	public void channelActive(ChannelHandlerContext ctx) throws Exception {
		Channel channel = ctx.channel();
		super.channelActive(ctx);
	}

	@Override
	public void channelInactive(ChannelHandlerContext ctx) throws Exception {
		super.channelInactive(ctx);
	}

	/*
	//表示 channel 处于就绪状态, 提示上线
	@Override
	public void channelActive(ChannelHandlerContext ctx) throws Exception {
		Channel channel = ctx.channel();
		//将该客户加入聊天的信息推送给其它在线的客户端
		//该方法会将 channelGroup 中所有的 channel 遍历，并发送消息
		channelGroup.writeAndFlush("[ 客户端 ]" + channel.remoteAddress() + " 上线了 " + sdf.format(new
				java.util.Date())+ "\n");
		//将当前 channel 加入到 channelGroup
		channelGroup.add(channel);
		System.out.println(ctx.channel().remoteAddress() + " 上线了"+ "\n");
	}

	//表示 channel 处于不活动状态, 提示离线了
	@Override
	public void channelInactive(ChannelHandlerContext ctx) throws Exception {
		Channel channel = ctx.channel();
		//将客户离开信息推送给当前在线的客户
		channelGroup.writeAndFlush("[ 客户端 ]" + channel.remoteAddress() + " 下线了"+ "\n");
		System.out.println(ctx.channel().remoteAddress() + " 下线了"+ "\n");
		System.out.println("channelGroup size=" + channelGroup.size());
	}

	//读取数据
	@Override
	protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception {
		//获取到当前 channel
		Channel channel = ctx.channel();
		//这时我们遍历 channelGroup, 根据不同的情况， 回送不同的消息
		channelGroup.forEach(ch -> {
			if (channel != ch) { //不是当前的 channel,转发消息
				ch.writeAndFlush("[ 客户端 ]" + channel.remoteAddress() + " 发送了消息：" + msg + "\n" + "_");
			} else {//回显自己发送的消息给自己
				ch.writeAndFlush("[ 自己 ]发送了消息：" + msg + "\n");
			}
		});
	}*/
}
